﻿#ifndef VIEW_H
#define VIEW_H

#include <QApplication>
#include <QMainWindow>
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QMediaPlaylist>
#include <QMediaPlayer>
#include <QSlider>

class View
{
private:
    QLabel * p_Number[16];                       // 数字面板指针
    QLabel * p_CurrentScore = new QLabel;        // 当前得分面板指针
    QLabel * p_OptimalScore = new QLabel;        // 历史最高分面板指针
    QLabel * p_Gameover = new QLabel;            // 游戏结束面板指针
    QLabel * p_Victory = new QLabel;             // 游戏通关面板指针
    QLabel * p_Combo = new QLabel;               // 连击面板指针
    QLabel * p_Tip = new QLabel;                 // 提示面板指针
    QLabel * p_Voice = new QLabel;               // 音量面板指针

    QVBoxLayout * vlayout1 = new QVBoxLayout();  // 垂直布局1
    QHBoxLayout * hlayout1 = new QHBoxLayout();  // 水平布局1
    QHBoxLayout * hlayout2 = new QHBoxLayout();  // 水平布局2
    QHBoxLayout * hlayout3 = new QHBoxLayout();  // 水平布局3
    QGridLayout * glayout = new QGridLayout;     // 栅格布局
    QSpacerItem * horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);  // 水平分割条

    QMediaPlaylist * musiclist = new QMediaPlaylist;  // 背景音乐歌单

    /*
     * Function: renewNumber
     * Summary: 更新数字面板实时数据
     * Input: int ** getData()
     * Output: void
     */
    void renewNumber(int ** arr );

    /*
     * Function: renewCurrentScore
     * Summary: 更新当前得分面板实时数据
     * Input: int currentScore
     * Output: void
     */
    void renewCurrentScore(int currentScore);




    /*
     * Function: setCurrentScoreLabel
     * Summary: 初始化当前得分面板并输入初始数据0
     * Input: void
     * Output: void
     */
    void setCurrentScoreLabel();

    /*
     * Function: setOptimalScoreLabel
     * Summary: 初始化历史最高分面板并输入初始数据
     * Input: void
     * Output: void
     */
    void setOptimalScoreLabel(int optimalScore);

    /*
     * Function: setGameoverLabel
     * Summary: 初始化游戏结束面板
     * Input: void
     * Output: void
     */
    void setGameoverLabel();

    /*
     * Function: setVictoryLabel
     * Summary: 初始化游戏通关面板
     * Input: void
     * Output: void
     */
    void setVictoryLabel();

    /*
     * Function: setTipLabel
     * Summary: 初始化提示面板
     * Input: void
     * Output: void
     */
    void setTipLabel();

    /*
     * Function: setButton
     * Summary: 初始化按钮面板
     * Input: void
     * Output: void
     */
    void setButton();

    /*
     * Function: setVoiceLabel
     * Summary: 初始化音量面板
     * Input: void
     * Output: void
     */
    void setVoiceLabel();

    /*
     * Function: setVoiceSlider
     * Summary: 初始化音量滑块
     * Input: void
     * Output: void
     */
    void setVoiceSlider();

    /*
     * Function: setComboLabel
     * Summary: 初始化连击面板
     * Input: void
     * Output: void
     */
    void setComboLabel();

    /*
     * Function: startMusic
     * Summary: 开始播放背景音乐
     * Input: void
     * Output: void
     */
    void startMusic();

    /*
     * Function: displayGameover
     * Summary: 显示游戏结束面板
     * Input: void
     * Output: void
     */
    void displayGameover();

    /*
     * Function: displayVictory
     * Summary: 显示游戏通关面板
     * Input: void
     * Output: void
     */
    void displayVictory();

    /*
     * Function: displayCombo
     * Summary: 显示连击面板：combo×4
     * Input: int comboNumber
     * Output: void
     */
    void displayCombo(int comboNumber);

public:
    QPushButton * ai = new QPushButton;         // AI按钮指针
    QPushButton * restart = new QPushButton;    // 重新开始按钮指针
    QPushButton * tip = new QPushButton;        // 提示按钮指针

    QSlider * voiceSlider = new QSlider;        // 音量调节滑块

    QMediaPlayer * music = new QMediaPlayer;    // 背景音乐播放器

    QVBoxLayout * mainlayout;                   // 垂直主布局

    /*
     * Function: renewNumber
     * Summary: 游戏界面布局，arr为初始随机生成的数组，optimalScore为存于文档中的历史最高分
     * Input: int ** arr, int optimalScore
     * Output: void
     */
    void layout(int ** arr, int optimalScore);

    /*
     * Function: renew
     * Summary: 更新面板数据，arr为待输入面板的数组，currentScore为待输入面板的当前得分
     * Input: int ** arr, int directionID, int currentScore
     * Output: void
     */
    void renew(int ** arr, int currentScore);

    /*
     * Function: display
     * Summary: 显示游戏通关、结束、连击时的图案，游戏通关（结束）时，victory(gameover)为1，comboNumber为连击次数
     * Input: bool victory, bool gameover, int comboNumber
     * Output: void
     */
    void display(bool victory, bool gameover, int comboNumber);

    /*
     * Function: renewTip
     * Summary: 更新提示面板实时数据，directionID为待输入提示面板的方向ID，1234对应上下左右
     * Input: int directionID
     * Output: void
     */
    void renewTip(int directionID);

    /*
     * Function: renewOptimalScore
     * Summary: 更新历史最高分面板实时数据
     * Input: int optimalScore
     * Output: void
     */
    void displayOptimalScore(int optimalScore);


signals:

};

#endif // VIEW_H
